datos <- read_excel("C:/Users/Brandon/Desktop/Proyecto de Graduacion Promidat/Datos_simulacion (1).xlsx")
str(datos)tibble [644 x 55] (S3: tbl_df/tbl/data.frame)
$ Dates : POSIXct[1:644], format: "2018-11-16" "2018-11-19" ...
$ G101121 : num [1:644] 91.4 91.4 91.4 91.1 91.2 ...
$ G170822 : num [1:644] 89.7 89.7 89.7 89.3 89.5 ...
$ G230823 : num [1:644] 88.3 88.3 88.2 89 89 ...
$ G101221 : num [1:644] 101 101 101 101 101 ...
$ G260826 : num [1:644] 108 108 108 108 108 ...
$ G230222 : num [1:644] 102 102 102 102 102 ...
$ G210224 : num [1:644] 100 100 100 100 100 ...
$ G160725 : num [1:644] 96.4 96.4 96.4 96.4 96.4 ...
$ G200524 : num [1:644] 89.8 89.8 89.7 89.5 89.6 ...
$ G221130 : num [1:644] 88.1 88.1 88.1 87.9 87.9 ...
$ G261125 : num [1:644] 84 84 84 84 84 ...
$ G250522 : num [1:644] 90.2 90.2 90.1 89.8 90 ...
$ G260527 : num [1:644] 89.8 89.8 89.8 89.8 89.8 ...
$ B1 : num [1:644] 96.2 96.2 95.2 95.2 95 ...
$ SERIEB3 : num [1:644] 95.8 95.8 95.8 95.8 95.8 ...
$ US105756CC23: num [1:644] 98.9 98.9 98.9 98.9 98.9 ...
$ USP3579ECH82: num [1:644] 99.8 99.8 99.8 99.8 99.8 ...
$ USP3579ECJ49: num [1:644] 101 101 101 101 101 ...
$ USP3699PGB78: num [1:644] 86.8 86.5 85.8 86 86 ...
$ ICSUUSA : num [1:644] 107 107 107 107 107 ...
$ Brazil45 : num [1:644] 84.2 83.9 83.3 83.4 83.4 ...
$ Brazil23 : num [1:644] 93.1 93.1 92.9 93 93 ...
$ Brazil25 : num [1:644] 121 121 121 121 121 ...
$ RepDom44 : num [1:644] 103 103 101 102 102 ...
$ RepDom25 : num [1:644] 98.5 98.2 97.9 97.8 97.8 ...
$ Colom33 : num [1:644] 148 148 147 146 146 ...
$ Colom37 : num [1:644] 119 119 118 119 119 ...
$ Colom41 : num [1:644] 107 106 106 106 106 ...
$ XLV : num [1:644] 92 90.9 90 89.5 89.5 ...
$ XLK : num [1:644] 68.2 65.6 64.2 64.7 64.7 ...
$ QQQ : num [1:644] 168 162 159 160 160 ...
$ SPY : num [1:644] 274 269 264 265 265 ...
$ XLI : num [1:644] 72 70.8 69.4 69.9 69.9 ...
$ XLB : num [1:644] 55.2 54.5 53.5 53.9 53.9 ...
$ XLY : num [1:644] 106 104 101 102 102 ...
$ XLE : num [1:644] 67.2 67.2 65 66 66 ...
$ XD5D : num [1:644] 39.3 39 38.4 38.9 38.5 ...
$ JPMEIAC : num [1:644] 139 139 136 138 140 ...
$ IXN : num [1:644] 26.4 25.4 24.8 25.1 25.1 ...
$ IVV : num [1:644] 276 271 266 267 267 ...
$ EWJ : num [1:644] 54.7 54.5 53.5 54.3 54.3 ...
$ IJR : num [1:644] 79.1 77.8 76.3 77.1 77.1 ...
$ JPJEIAC : num [1:644] 161 164 160 158 161 ...
$ EFV : num [1:644] 48.5 48.2 47.5 48.1 48.1 ...
$ ENZL : num [1:644] 48.1 47.1 46.1 46.9 46.9 ...
$ IWM : num [1:644] 152 149 146 148 148 ...
$ XLF : num [1:644] 26.8 26.8 26.2 26.2 26.2 ...
$ Bitcoin : num [1:644] 5452 4786 4338 4450 4428 ...
$ Euro : num [1:644] 1.14 1.15 1.14 1.14 1.14 1.13 1.13 1.13 1.14 1.14 ...
$ Yen : num [1:644] 113 113 113 113 113 ...
$ Real : num [1:644] 3.74 3.76 3.76 3.8 3.8 3.83 3.93 3.88 3.85 3.85 ...
$ PesoMXN : num [1:644] 20.2 20.4 20.4 20.2 20.3 ...
$ Petroleo : num [1:644] 56.5 56.8 53.4 54.6 54.6 ...
$ Maiz : num [1:644] 420 418 418 418 418 ...
Al ser series de tiempo correspondientes a cotizaciones de diferentes opciones de inversión, es importante convertir los precios a rendimientos mediante ln(X/X t-1) esto para que las cotizaciones sean comparables:
datos <- read_excel("C:/Users/Brandon/Desktop/Proyecto de Graduacion Promidat/Datos_simulacion (1).xlsx",
sheet = "Datos_ln")
datos <- na.omit(datos)
datos$Dates<- as.Date(datos$Dates)
str(datos)tibble [641 x 55] (S3: tbl_df/tbl/data.frame)
$ Dates : Date[1:641], format: "2018-11-19" "2018-11-20" ...
$ G101121 : num [1:641] 0 -0.000438 -0.002959 0.001426 0.000219 ...
$ G170822 : num [1:641] 0 -0.000446 -0.003575 0.001789 0.000223 ...
$ G230823 : num [1:641] 0.000113 -0.000567 0.008577 0.000112 0.000112 ...
$ G101221 : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ G260826 : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ G230222 : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ G210224 : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ G160725 : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ G200524 : num [1:641] 0 -0.000557 -0.002902 0.001452 0.000112 ...
$ G221130 : num [1:641] 0.000114 -0.000114 -0.002273 0 0 ...
$ G261125 : num [1:641] 0 0 0.000119 -0.000119 0.000238 ...
$ G250522 : num [1:641] 0.000111 -0.000555 -0.003334 0.001557 0.000222 ...
$ G260527 : num [1:641] -0.000111 0 0 0 0 ...
$ B1 : num [1:641] 0 -0.01044 0 -0.00263 -0.00253 ...
$ SERIEB3 : num [1:641] 0 0 0.000104 0 0.000104 ...
$ US105756CC23: num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ USP3579ECH82: num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ USP3579ECJ49: num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
$ USP3699PGB78: num [1:641] -0.00346 -0.008936 0.002678 0 -0.000116 ...
$ ICSUUSA : num [1:641] 1.88e-04 9.38e-05 0.00 0.00 2.81e-04 ...
$ Brazil45 : num [1:641] -0.00369 -0.00682 0.00108 0 -0.00324 ...
$ Brazil23 : num [1:641] -0.000537 -0.00172 0.001076 0 -0.001183 ...
$ Brazil25 : num [1:641] -0.001321 0.000496 0.002474 0 -0.002227 ...
$ RepDom44 : num [1:641] -0.005738 -0.010491 0.001674 0 -0.000787 ...
$ RepDom25 : num [1:641] -0.003253 -0.002957 -0.000715 0 -0.000511 ...
$ Colom33 : num [1:641] -0.00176 -0.00224 -0.00743 0 0 ...
$ Colom37 : num [1:641] -0.00453 -0.00438 0.00194 0 -0.00059 ...
$ Colom41 : num [1:641] -0.00452 -0.0051 0.00189 0 -0.00123 ...
$ XLV : num [1:641] -0.01279 -0.0094 -0.00568 0 0.00145 ...
$ XLK : num [1:641] -0.03886 -0.02172 0.00729 0 -0.00917 ...
$ QQQ : num [1:641] -0.03302 -0.01806 0.00757 0 -0.00726 ...
$ SPY : num [1:641] -0.0171 -0.0187 0.0034 0 -0.0067 ...
$ XLI : num [1:641] -0.01596 -0.02097 0.00704 0 -0.00201 ...
$ XLB : num [1:641] -0.0144 -0.01835 0.00801 0 -0.01082 ...
$ XLY : num [1:641] -0.0247 -0.0229 0.0104 0 -0.0045 ...
$ XLE : num [1:641] -0.000298 -0.033306 0.01558 0 -0.031876 ...
$ XD5D : num [1:641] -0.00868 -0.01524 0.01216 -0.00852 0.00363 ...
$ JPMEIAC : num [1:641] 0.00403 -0.02163 0.01486 0.01064 -0.01885 ...
$ IXN : num [1:641] -0.0367 -0.0223 0.0108 0 -0.0096 ...
$ IVV : num [1:641] -0.01686 -0.01873 0.00323 0 -0.0062 ...
$ EWJ : num [1:641] -0.0044 -0.01853 0.01522 0 -0.00369 ...
$ IJR : num [1:641] -0.0167 -0.01947 0.0103 0 -0.00013 ...
$ JPJEIAC : num [1:641] 0.01736 -0.02585 -0.00988 0.01874 0 ...
$ EFV : num [1:641] -0.00661 -0.01504 0.01338 0 -0.00981 ...
$ ENZL : num [1:641] -0.01954 -0.02122 0.01655 0 -0.00513 ...
$ IWM : num [1:641] -0.020479 -0.019468 0.013877 0 -0.000946 ...
$ XLF : num [1:641] -0.000373 -0.022278 0.000763 0 -0.008044 ...
$ Bitcoin : num [1:641] -0.13033 -0.09826 0.02566 -0.00509 -0.03851 ...
$ Euro : num [1:641] 0.00873 -0.00873 0 0 -0.00881 ...
$ Yen : num [1:641] -2.48e-03 1.95e-03 2.57e-03 -9.73e-04 8.85e-05 ...
$ Real : num [1:641] 0.00533 0 0.01058 0 0.00786 ...
$ PesoMXN : num [1:641] 0.00987 0 -0.00591 0.00296 0.00491 ...
$ Petroleo : num [1:641] 0.0053 -0.0605 0.0222 0 -0.0802 ...
$ Maiz : num [1:641] -0.00478 0 0 0 0 ...
- attr(*, "na.action")= 'omit' Named int [1:3] 1 350 351
..- attr(*, "names")= chr [1:3] "1" "350" "351"
A continuacion se realizara un Analisis en Componentes Principales (ACP) ya que le objetivo de este es construir un numero reducido de nuevas variables en las que se concentre la mayor cantidad posible de informacion de manera que en nuestro caso sera ver la agrupacion de las variables de la cartera de inversion.
modelo <- PCA(datos1, scale.unit = TRUE, ncp = 4, graph = F)
fviz_pca_var(X = modelo,
col.var = "steelblue")Es posible ver que las variables se podrian agrupar por cuadrantes en las cuales las del primer cuadrante estarian correlacionadas positivamente igual que las del 4to cuadrante y algunas de estas estarian correlacionadas negativamente con el Peso MXN el real y el yen que serian las variables mas alejadas.
Es posible observar que los puntos en este grafico se podrian dividir por cuadrante obteniendo 4 grandes cluster o podriamos dividirlo en 2 grandes clusters quedara mas claro mas adelante.
Ahora se procede a eliminar los individuos mal representados con un (coseno cuadrado menor al 20%)
cos2.ind <- (modelo$ind$cos2[,1] + modelo$ind$cos2[,2])*100
cos2.var <- (modelo$var$cos2[,1] + modelo$var$cos2[,2])*100
round(cos2.var,2) G101121 G170822 G230823 G101221 G260826 G230222
19.77 21.97 14.00 14.33 5.71 21.35
G210224 G160725 G200524 G221130 G261125 G250522
0.14 10.02 9.96 0.74 13.68 24.97
G260527 B1 SERIEB3 US105756CC23 USP3579ECH82 USP3579ECJ49
5.32 3.39 1.54 6.62 0.29 2.06
USP3699PGB78 ICSUUSA Brazil45 Brazil23 Brazil25 RepDom44
34.60 11.57 72.40 63.46 52.54 42.41
RepDom25 Colom33 Colom37 Colom41 XLV XLK
53.10 12.67 66.03 67.47 73.82 81.05
QQQ SPY XLI XLB XLY XLE
77.58 95.57 85.78 83.41 86.48 63.42
XD5D JPMEIAC IXN IVV EWJ IJR
59.17 1.10 82.82 95.63 73.36 82.62
JPJEIAC EFV ENZL IWM XLF Bitcoin
12.41 85.87 63.91 86.45 82.40 5.97
Euro Yen Real PesoMXN Petroleo Maiz
9.11 25.51 16.35 48.19 6.55 2.39
Se observan cuales variables se encuentran bien representadas y cuales no tan bien.
fviz_pca_ind(modelo,
pointsize = 5,
pointshape = 21,
fill = "#E7B800",
select.ind = list(cos2 = 0.2)
)En este grafico ya con la eliminacion de las variables mal representadas parece ser que las observaciones o puntos se dividen entre cuadrantes
Es posible ver las agrupaciones o cluster que se generarian por cuadrantes en el caso del segundo cuadrante las observaciones tendrian una correlacion negativa con las variables del cuarto cuadrante al igual que las del primer y tercer cuadrante.
G101121 G170822 G230823 G101221 G260826 G230222 G210224 G160725
G101121 1.00 0.33 0.16 0.39 0.14 0.30 0.04 0.04
G200524 G221130 G261125 G250522 G260527 B1 SERIEB3 US105756CC23
G101121 0.13 0.06 0.09 0.41 0.15 0.16 0.04 0.02
USP3579ECH82 USP3579ECJ49 USP3699PGB78 ICSUUSA Brazil45 Brazil23
G101121 0.00 0.04 0.12 0.00 0.05 0.05
Brazil25 RepDom44 RepDom25 Colom33 Colom37 Colom41 XLV XLK
G101121 0.06 0.06 0.09 -0.01 0.05 0.05 -0.03 -0.04
QQQ SPY XLI XLB XLY XLE XD5D JPMEIAC IXN IVV
G101121 -0.05 -0.04 0.00 -0.01 -0.04 0.03 0.02 0.03 -0.05 -0.04
EWJ IJR JPJEIAC EFV ENZL IWM XLF Bitcoin Euro Yen
G101121 -0.02 -0.01 -0.01 0.00 0.02 -0.01 0.00 0.05 0.02 -0.06
Real PesoMXN Petroleo Maiz
G101121 -0.05 -0.05 0.05 0.06
[ reached getOption("max.print") -- omitted 53 rows ]
Una vez que calculamos el coeficiente de correlación, es necesario identificar si es estadísticamente significativo, por lo que calculamos el p-value.
Si el p-value es menor al nivel de significancia que nosotros escogemos, por ejemplo 5%, entonces el coeficiente es estadísticamente significativo.
G101121 G170822 G230823 G101221 G260826 G230222 G210224 G160725
G101121 1.00 0.33 0.16 0.39 0.14 0.30 0.04 0.04
G200524 G221130 G261125 G250522 G260527 B1 SERIEB3 US105756CC23
G101121 0.13 0.06 0.09 0.41 0.15 0.16 0.04 0.02
USP3579ECH82 USP3579ECJ49 USP3699PGB78 ICSUUSA Brazil45 Brazil23
G101121 0.00 0.04 0.12 0.00 0.05 0.05
Brazil25 RepDom44 RepDom25 Colom33 Colom37 Colom41 XLV XLK
G101121 0.06 0.06 0.09 -0.01 0.05 0.05 -0.03 -0.04
QQQ SPY XLI XLB XLY XLE XD5D JPMEIAC IXN IVV
G101121 -0.05 -0.04 0.00 -0.01 -0.04 0.03 0.02 0.03 -0.05 -0.04
EWJ IJR JPJEIAC EFV ENZL IWM XLF Bitcoin Euro Yen
G101121 -0.02 -0.01 -0.01 0.00 0.02 -0.01 0.00 0.05 0.02 -0.06
Real PesoMXN Petroleo Maiz
G101121 -0.05 -0.05 0.05 0.06
[ reached getOption("max.print") -- omitted 53 rows ]
n= 641
P
G101121 G170822 G230823 G101221 G260826 G230222 G210224 G160725
G101121 0.0000 0.0000 0.0000 0.0002 0.0000 0.3269 0.2623
G200524 G221130 G261125 G250522 G260527 B1 SERIEB3
G101121 0.0008 0.1525 0.0209 0.0000 0.0000 0.0000 0.2795
US105756CC23 USP3579ECH82 USP3579ECJ49 USP3699PGB78 ICSUUSA
G101121 0.5661 0.9661 0.3121 0.0033 0.9759
Brazil45 Brazil23 Brazil25 RepDom44 RepDom25 Colom33 Colom37
G101121 0.2477 0.2174 0.1407 0.1359 0.0185 0.7833 0.1721
Colom41 XLV XLK QQQ SPY XLI XLB XLY XLE
G101121 0.1681 0.4805 0.2564 0.2180 0.3762 0.9157 0.7106 0.2782 0.4738
XD5D JPMEIAC IXN IVV EWJ IJR JPJEIAC EFV ENZL
G101121 0.5580 0.4283 0.2399 0.3362 0.5306 0.7853 0.7583 0.9433 0.5875
IWM XLF Bitcoin Euro Yen Real PesoMXN Petroleo Maiz
G101121 0.8717 0.9847 0.2205 0.6391 0.1547 0.2165 0.2434 0.1869 0.1321
[ reached getOption("max.print") -- omitted 53 rows ]
En la grafica de correlaciones se identifica mediante color azul, la correlacion positiva entre variables, a mayor intensidad del color mayor es la correlación positiva entre ellas. Por otra parte, la correlacion negativa, es decir, si el rendimiento de una aumenta, el rendimientos de la otra disminuye, se identifica mediante el color rojo, y su intensidad indica mayor correlacion negativa.
Para proceder con nuestro análisis, dado que datos_cor es una base de datos de serie de tiempo, tenemos que utilizar la traspuesta de la base de datos:
Una vez definida la base de datos, se procede a realizar el análisis de Clustering Jerárquico o Agrupación.
clustering jerárquico es una técnica para agrupar puntos de datos similares en un grupo y separar las diferentes observaciones en diferentes grupos. Los clusters se crean de manera que tengan un orden predeterminado, es decir, una jerarquía.
Para determinar, la cantidad de clusters con la cuál se estabiliza el modelo, se utiliza la técnica del codo de Jambu:
InerciaIC<-rep(0,9)
for(k in 1:9) {
grupos<-kmeans(datos_T, centers=k, nstart=5,iter.max = 100)
InerciaIC[k]<-grupos$tot.withinss
}
plot(InerciaIC,col="blue",type="b")El codo de Janbu indica que lo ideal es definir 4 clusters para el modelo.
Una vez que tenemos el número de clusteres, se procede a realizar el dendograma:
distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "complete")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "single")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "average")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "centroid")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "ward.D")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")library(purrr)
# Vector comparativo de métodos:
metodos <- c( "average", "single", "complete", "ward")
names(metodos) <- c( "average", "single", "complete", "ward")
# Funcion para comparar métodos:
ac <- function(x) {
agnes(datos_T, method = x)$ac
}
map_dbl(metodos, ac) average single complete ward
0.8496885 0.8614611 0.8655797 0.8853590
Al utilizar la funcion agnes, obtenemos el coeficiente de aglomeración, que mide la cantidad de estructura de agrupamiento encontrada (los valores más cercanos a 1 sugieren una estructura de agrupación fuerte). En este caso, el mejor método es el método ward.
De acuerdo con los resultados utilizando el método Ward.D, el cluster 1 agrupa las opciones de inversión que corresponden a bonos de deuda de países como Costa Rica, Brasil, República Dominicana, Colombia, y monedas como el Euro, el Yen y el Real. Además, incluye 1 materia prima: Maiz
El cluster 2, incluye los indices accionarios y los cluster 3 y 4, el bitcoin y el petroleo, respectivamente.
El modelo cumple con nuestras expectativas respecto a identificar de una manera más eficiente los instrumentos que tienen un comportamiento similar entre sí, de esta forma es más sencillo seleccionar los instrumentos que permitan diversificar los portafolios en pro de obtener una mayor rentabilidad de las inversiones.